const statuses = require('statuses')
/**
 * 1、通过throw抛出，这时可通过new Error来指定err.status状态达到抛出状态
 *    const err = new Error('这是我自定义的message信息');
 *    err.status = 1001;
 *    throw err;
 * 2、通过ctx.throw(status, message) 抛出，这时自定义状态码受以下限制
 *    如果状态码 !statuses[status] && (status < 400 || status >= 600) 的错误都会被指定为500，这时回被catch error见http-errors模块 line84行
 *    如：ctx.throw(1001, '这是我自定义的message信息')，这里自定义的状态码1001会被转换成500，且自定义message也会失效
 */

module.exports = () => {
  return async (ctx, next) => {
    try {
      await next();
    } catch (error) {
      let code = error.status, message = error.message, status = ctx.status;
      console.error(code, message, status);
      if (message) {
        ctx.body = ctx.code.respond(undefined, code, message);
        ctx.status = status;
      } else {
        throw error;
      }
    }
  };
};
